<?php
/**
 * File Name...: application\controllers\release.php
 * Framework...: Blackbird Framework
 * Author......: KnKill, 2010 (c) KnKill Corporation
 */



/**
 * @package Blackbird Framework
 * @subpackage Application Controllers
 * @since 0.1
 */
class Controller_Release extends Base_Controller
{


function __construct()
{
    parent::preload(); 
}



/**
 * Главная функция. Перебрасывает на страницу с релизами
 */
function index()
{
    header('Location:' . APP_URL . '/release/page/1');
}



function add() 
{
    $this->view->assign('title', 'Добавление нового релиза');
    $this->view->assign('release_types', $this->get_release_types());
    $this->view->display('release/add.php');
}



function edit($id)
{
    if (! is_numeric($id) || ($id < 1)) {
        echo 'Hacking Attempt'; return false;
    }
    $query = $this->db->prepare('SELECT * FROM `releases` WHERE id=?');
    $query->execute(array($id));
    if ($query->rowCount() == 0) {
        $this->view->assign('error_title', 'Произошла ошибка');
        $this->view->assign('error_text', 'Релиза с ID <b>' . (int)$id . '</b> не существует');
        $this->view->display('errors/simple_error.php');
        return false; 
    }
    $data = $query->fetch();
    $data['artists'] = explode('|||', $data['artists']);
    $this->view->assign('release_types', $this->get_release_types());
    $this->view->assign('data', $data);
    $this->view->assign('title', 'Редактирование релиза ' . $data['release']);
    $this->view->display('release/edit.php');
}



function view($id = -1)
{
    // Проверяем номер релиза
    if (! is_numeric($id) || ($id < 1)) {
        echo 'Hacking Attempt'; return false;
    }
    // Подготаливает запрос для удаления
    $query = $this->db->prepare('SELECT * FROM `releases` WHERE id=?');
    // Выполняем запрос
    $query->execute(array((int)$id));
    // Обрабатываем запрос и получаем результат
    $release = $query->fetch();
    
    // Если релиза с указанным ID не найдено - отображаем сообщение об ошибке
    if (! $release) {
        $this->view->assign('error_title', 'Произошла ошибка');
        $this->view->assign('error_text', 'Релиза с ID <b>' . (int)$id . '</b> не существует');
        $this->view->display('errors/simple_error.php');
        return false;
    }
    $release['artists'] = str_replace('|||', ', ', $release['artists']);
    $this->view->assign('title', $release['artists'] . ' &mdash; ' . $release['release']);
    $this->view->assign('release', $release);
    $this->view->display('release/view.php');
}



function _add($data)
{
    if (! preg_match('/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/', $data['date'], $matches)) {
        return 'INVALID_DATE';
    }
    $year  = intval($matches[1]);
    $month = intval($matches[2]);
    $day   = intval($matches[3]);
    if ($year < 1990 || $year > 2020 || $mouth > 12 || $mouth < 0 || $day > 31 || $day < 0) {
        return 'INVALID_DATE';
    }
    if (count($data['artists']) < 1) {
        return 'NO_ARTISTS';
    }
    
    // Подготавливаем SQL запрос
    $sql  = 'INSERT INTO `releases` (`artists`, `release`, `label`, `catalog`, `date`, `tracklist`, `type`, `status`, `vote`, `votes_count`) ';
    $sql .= 'VALUES (:artists, :release, :label, :catalog, :date, :tracklist, :type, :status, :vote, :votes_count)';
    $query = $this->db->prepare($sql);
    // Подставляем значения в SQL-запрос
    $array = array(
      ':artists'     => implode('|||', $data['artists']),
      ':release'     => $data['release'],
      ':label'       => $data['label'],
      ':catalog'     => $data['catalog'],
      ':date'        => $data['date'],
      ':tracklist'   => $data['tracklist'],
      ':type'        => $data['type'],
      ':status'      => Predefined_Constans::RLS_STATUS_UNRELEASED,
      ':vote'        => 0,
      ':votes_count' => 0
    );
    // Выполняем запрос
    return $query->execute($array);
}



function _edit($data)
{
    $id = (int)$data['release_id'];
    unset($data['release_id']);
    $data['artists'] = implode('|||', $data['artists']);
    return $this->db->update('releases', $data)->where('id', (int)$id)->execute();
}



function _set_status($id, $status)
{
    $query = $this->db->prepare('UPDATE `releases` SET status=? WHERE id=?');
    return $query->execute(array((int)$status, (int)$id));
}



function _delete($id)
{
    $query = $this->db->prepare('DELETE FROM `releases` WHERE id=?');
    if ($query->execute(array((int)$id))) {
        return ($query->rowCount() != 0) ? true : false;
    }
    return false;
}



function _vote($id, $action)
{
    if ($action == 'p'): $action = 1; elseif ($action == 'n'): $action = -1; endif;
    $query = $this->db->prepare('UPDATE `releases` SET vote=vote+?, votes_count=votes_count+1 WHERE id=?');
    if ($query->execute(array($action, $id))) {
        return ($query->rowCount() > 0) ? true : false;
    }
    return false;
}



function _info($id)
{
    $query = $this->db->prepare('SELECT * FROM `releases` WHERE id=?');
    $query->execute(array($id));
    return $query->fetch();
}



function ajax_info()
{
    $release = $this->_info(input::post('id'));
    if (! $release) {
        $this->view->assign('error_title', 'Произошла ошибка');
        $this->view->assign('error_text', 'К сожалению, исходный релиз не найден. Возможно его никогда не существовало, или он был удалён');
        $this->view->display('ajax_blocks/error.php');
        return false;
    }
    $release['artists'] = str_replace('|||', ', ', $release['artists']);
    $this->view->assign('release', $release);
    $this->view->display('ajax_blocks/release_info.php');
}



function page($page = 1)
{
    // Привет хакерам и ламерам
    if (! is_numeric($page) || ($page < 1) || ($page > 60000)) {
        echo 'Hacking Attempt'; return false;
    }
    $limit = ($page - 1) * 20;
    $releases = $this->db->prepare('SELECT * FROM `releases` ORDER BY `id` DESC LIMIT :limit, 20');
    $releases->bindParam(':limit', $limit, PDO::PARAM_INT);
    $releases->execute();
    $releases = $releases->fetchAll();
    for ($i = 0; $i < count($releases); $i++) {
        $releases[$i]['artists'] = str_replace('|||', ', ', $releases[$i]['artists']);
    }
    
    $this->view->assign('title', 'Релизы');
    $this->view->assign('releases', $releases);
    $this->view->display('release/list.php');
}


function ajax_edit()       { $this->bool_ajax($this->_edit(input::post())); }
function ajax_set_status() { $this->bool_ajax($this->_set_status(input::post('id'), input::post('status'))); }
function ajax_delete()     { $this->bool_ajax($this->_delete(input::post('id'))); }
function ajax_vote()       { $this->bool_ajax($this->_vote(input::post('id'), input::post('action'))); }
function ajax_add()        { /*$this->bool_ajax($this->_add(input::post()));*/ echo $this->_add(input::post()); }

}